package com.browsesoft.oa;

import java.io.OutputStream;
import java.util.Hashtable;

import javax.servlet.http.HttpServletRequest;

import com.browsesoft.baseadapter.BlobEntity;
import com.browsesoft.baseadapter.BlobEntityFactory;
import com.browsesoft.syntax.StreamEndException;
import com.browsesoft.syntax.TokenParser;

/**
 * <p>
 * Title:
 * </p>
 * <p>
 * Description: 对于附件，保存后返回的文件名带了id号。
 * </p>
 * <p>
 * Copyright: Copyright (c) 2005
 * </p>
 * <p>
 * Company: BrowseStar
 * </p>
 * 
 * @author 李涛
 * @version 1.0
 */
public class BSMIMEParser extends TokenParser {
	/**
	 * 
	 */
	private static final long serialVersionUID = 6056589392960134249L;

	private Hashtable params;

	// 对于文件，记录其大小
	private int fileSize = 0;

	private String realName;

	/**
	 * 构造方法
	 * 
	 * @param request
	 * @throws Exception
	 */
	public BSMIMEParser(HttpServletRequest request) throws Exception {
		super(request.getInputStream());
		parse();
	}

	public void parse() throws Exception {
		this.params = new Hashtable();
		// 读出分界符
		try {
			byte[] line = getLine();
			// 因为读入的每 一行，有'\n\\r\ 等，所以为了判断，去掉这个char
			byte[] pd = new byte[line.length - 1];
			System.arraycopy(line, 0, pd, 0, line.length - 1);
			while (line != null) {
				// 得到内容描述那一行
				String controlName = new String(getLine());
				while (controlName.indexOf("Content-Disposition:") == -1) {
					controlName = new String(getLine());
				}
				/**
				 * 如果得到则开始找到控件的名称和有没有文件
				 */
				if (controlName != null && !controlName.equals("")) {
					// 找到控件的名称的位置
					int position = controlName.indexOf("name=\"");
					// 找到文件的位置
					int fileNamePosition = controlName.indexOf("filename=\"");
					// 如果没有文件名称filename则说明，这是个控件，而不是一个文件
					if (position != 0 && fileNamePosition == -1) {
						// 得到控件名的终点
						int endPosition = controlName.indexOf("\"",
								position + 6);
						// 得到控件名的名称
						controlName = controlName.substring(position + 6,
								endPosition);
						// 得到控件的内容
						byte[] conext = this.getLine();
						String content = "";
						// 如果不是分界行，则一直得到内容
						while (new String(conext).indexOf(new String(pd)) == -1) {
							content += new String(conext);
							conext = this.getLine();
						}
						// 去掉首尾的空白及非显示字符
						content = content.trim();
						controlName = controlName.trim();
						if (this.params.get(controlName) == null) {
							this.params.put(controlName,
									new String[] { content });
						}
					}
					// 如果有文件名filename，则说明这是一个文件
					else if (position != 0 && fileNamePosition != -1) {
						// 得到控件名的终点
						int endPosition = controlName.indexOf("\"",
								position + 6);
						// 得到文件名的终点
						int endfilename = controlName.indexOf("\"",
								fileNamePosition + 10);
						// 取得文件名和完全路径和名字
						String fileName = controlName.substring(
								fileNamePosition + 10, endfilename);
						controlName = controlName.substring(position + 6,
								endPosition);
						// 为了只得到文 件的名字
						fileName = fileName.substring(fileName
								.lastIndexOf("\\") + 1);
						// 取得文件内容的类型
						byte[] type = this.getLine();
						while (new String(type).indexOf("Content-Type:") == -1) {
							type = this.getLine();
						}
						// 读掉多余的行
						this.getLine();
						this.getLine();
						this.getLine();
						this.realName = fileName;
						BlobEntity oracleBlobEntity = BlobEntityFactory
								.getInstance().newBlobEntity();
						this.params.put("blob_id",
								new String[] { oracleBlobEntity.getID() });
						OutputStream out = oracleBlobEntity.getOutputStream();
						// 取是文 件的内容 ，一次只取一行，且保存一次
						byte[] context1 = this.getLine();
						byte[] context2 = this.getLine();
						byte[] context3 = this.getLine();
						while (new String(context3).indexOf(new String(pd)) == -1) {
							out.write(context1);
							fileSize += context1.length;
							context1 = context2;
							context2 = context3;
							context3 = this.getLine();
						}
						out.write(context1, 0, context1.length - 1);
						fileSize += context1.length - 1;
						oracleBlobEntity.save();
						// 把文 件的名字，路径存入哈希表中
						this.params.put("realname", new String[] { realName });
						this.params.put("blob_id",
								new String[] { oracleBlobEntity.getID() });
					}
				}
			}
		} catch (StreamEndException e) {
		}
	}

	/**
	 * 返回所有参数
	 */
	public Hashtable getParameters() {
		return this.params;
	}

	public String getRealName() {
		return this.realName;
	}

	public String getBlobID() {
		String[] str = (String[]) this.params.get("blob_id");
		if (str == null) {
			return null;
		}
		return str[0];
	}

	/**
	 * 得到一行数据
	 */
	public byte[] getLine() throws Exception {
		byte[] result = new byte[1024];
		byte t = this.getChar();
		int count = 0;
		// 行没有结束时
		// 循环读字节
		while ((((char) t) != '\n') && ((char) t) != '\r' && count < 1023) {
			result[count] = t;
			// 读下一个字符
			t = this.getChar();
			count++;
		}
		result[count] = t;
		count++;
		byte[] temp = new byte[count];
		System.arraycopy(result, 0, temp, 0, temp.length);
		return temp;
	}
}
